/* eslint-disable no-void */
// 拦截器操作

import type {
  AxiosError,
  AxiosInstance,
  AxiosRequestConfig,
  AxiosResponse,
  InternalAxiosRequestConfig,
} from 'axios'
import { useAgentStore } from '@/stores'
import { MessageCodeError } from './error'
import { throttle } from 'lodash'
import router from '@/router/index'
import { createDiscreteApi } from 'naive-ui'
const { message } = createDiscreteApi(['message'])
// 不需要经过处理的接口白名单
const whiteList = ['login', 'logout']

// 处理请求头，一般比如在header加token
export const handlerRequest = async (config: AxiosRequestConfig) => {
  if (whiteList.includes(config.url as string)) return config as InternalAxiosRequestConfig<any>
  // const store = useAuthStore()
  // // token刷新
  // const refresFlag = Boolean(config.headers?.refreshToken !== 'true' && store.refreshToken)
  // if (refresFlag) {
  //   if (refresFlag) {
  //     // const res = await store.refreshTokenFun()
  //     // await setRefresh(res)
  //   }
  // }

  const { token } = useAgentStore()

  if (token) {
    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
    config.headers!.Authorization = `Bearer ${token}`
  }
  return config as InternalAxiosRequestConfig<any>
}

// 请求拦截器
// const refreshServices: Array<() => void> = []
// const setRefresh = async (res: any) => {
//   if (res === 'pending') {
//     return await new Promise((resolve, reject) => {
//       refreshServices.push(() => {
//         resolve(true)
//       })
//     })
//   } else if (res === 'success') {
//     refreshServices.forEach((callback) => {
//       callback()
//     })
//     refreshServices.length = 0
//     return await new Promise((resolve, reject) => {
//       resolve(true)
//     })
//   }
// }

// 根据情况处理返回数据

export const handleResponse = async (res: AxiosResponse, _instance?: AxiosInstance) => {
  // 在某些情况下instance可能会有用处
  const { data } = res
  let code = 200
  let msg = ''
  // blob返回单独处理
  if (Boolean(data) && data instanceof Blob) {
    if (data.type === 'application/json') {
      await data.text().then((text: string) => {
        const dataBlob = JSON.parse(text)
        code = dataBlob.message.code
        msg = dataBlob.message.message
      })
    } else {
      return res
    }
  } else {
    code = data.message.code
    msg = data.message.message
  }
  // 根据不同的code判断接下来的操作
  let flag = true
  switch (code) {
    case 401:
      // 处理密码超过90天了没更换跳转到修改密码页面
      showMessageThrottle()
      break
    case 200:
      flag = false
      break
    default:
      void message.error(MessageCodeError({ code, message: msg }))
      break
  }
  if (!flag) {
    // AxiosResponse data
    res.data = res.data.data
    return res
  }
}

const showMessage = () => {
  void message.error('登录token失效，请重新登录')
  void router.push('/login')
}
// 立即调用一次,节流结束后不调用
const showMessageThrottle = throttle(showMessage, 5000, {
  leading: true,
  trailing: false,
})

export const handleResponseErr = async (error: any) => {
  const { response, request } = error
  if (response !== null) {
    // 当响应状态码为非2xx时，可以在这里进行错误处理
    const { status } = response
    switch (status) {
      case 401:
        showMessageThrottle()
        break
      default:
        void message.error(MessageCodeError({ code: response.status }))
        break
    }
  }
  // else if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
  //   // 超时处理
  //   message.warning('请求超时，请检查网络连接并重新尝试！')
  // }
  else if (request !== null) {
    // 当没有响应时，可以在这里进行错误处理：个人建议无需处理
    // request
  } else {
    // 其他错误，可以在这里进行错误处理
    // error.message
  }
  // 超时判断
  return await Promise.reject(error)
}
